package com.xbongbong.sso.service.imp;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.DateTimeUtil;
import com.xbongbong.paas.toolbox.util.StringUtil;
import com.xbongbong.pro.enums.errorcodes.SsoErrorCodeEnum;
import com.xbongbong.sso.domain.entity.OauthUserEntity;
import com.xbongbong.sso.model.OauthUserModel;
import com.xbongbong.sso.pojo.dto.OauthUserAddDTO;
import com.xbongbong.sso.pojo.dto.OauthUserDetailDTO;
import com.xbongbong.sso.pojo.dto.OauthUserUpdateDTO;
import com.xbongbong.sso.pojo.vo.OauthUserAddVO;
import com.xbongbong.sso.pojo.vo.OauthUserDetailVO;
import com.xbongbong.sso.pojo.vo.OauthUserUpdateVO;
import com.xbongbong.sso.service.OauthUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * IDP用户对应唯一码
 */
@Service("oauthUserService")
public class OauthUserServiceImpl implements OauthUserService {
    private static final Logger LOG = LoggerFactory.getLogger(OauthUserServiceImpl.class);

    @Resource
    private OauthUserModel oauthUserModel;

    @Override
    public OauthUserDetailVO detail(OauthUserDetailDTO oauthUserDetailDTO) throws XbbException {
        String corpid = oauthUserDetailDTO.getCorpid();
        String userId = oauthUserDetailDTO.getOauthUserId();
        OauthUserEntity oauthUser = oauthUserModel.getByUserId(userId, corpid);
        OauthUserDetailVO oauthUserDetailVO = new OauthUserDetailVO();
        oauthUserDetailVO.setOauthUser(oauthUser);
        return oauthUserDetailVO;
    }

    @Override
    public OauthUserAddVO add(OauthUserAddDTO oauthUserAddDTO) throws XbbException {
        String corpid = oauthUserAddDTO.getCorpid();
        String userId = oauthUserAddDTO.getOauthUserId();
        String code = oauthUserAddDTO.getCode();
        if (codeRepeat(corpid, userId, code)) {
            throw new XbbException(SsoErrorCodeEnum.API_ERROR_273019);
        }
        OauthUserEntity oauthUser = new OauthUserEntity();
        oauthUser.setCorpid(corpid);
        oauthUser.setUserId(userId);
        oauthUser.setCode(code);
        oauthUserModel.insert(oauthUser);
        OauthUserAddVO oauthUserAddVO = new OauthUserAddVO();
        oauthUserAddVO.setDataId(oauthUser.getId());
        return oauthUserAddVO;
    }

    @Override
    public OauthUserUpdateVO update(OauthUserUpdateDTO oauthUserUpdateDTO) throws XbbException {
        String userId = oauthUserUpdateDTO.getOauthUserId();
        String code = oauthUserUpdateDTO.getCode();
        code = StringUtil.trim(code);
        String corpid = oauthUserUpdateDTO.getCorpid();
        if (codeRepeat(corpid, userId, code)) {
            throw new XbbException(SsoErrorCodeEnum.API_ERROR_273019);
        }
        OauthUserEntity oauthUser = oauthUserModel.getByUserId(userId, corpid);
        if (Objects.isNull(oauthUser)) {
            oauthUser = new OauthUserEntity();
            oauthUser.setCorpid(corpid);
            oauthUser.setUserId(userId);
            oauthUser.setCode(code);
            oauthUserModel.insert(oauthUser);
        } else {
            oauthUser.setCode(code);
            oauthUser.setUpdateTime(DateTimeUtil.getInt());
            oauthUserModel.update(oauthUser);
        }
        OauthUserUpdateVO oauthUserUpdateVO = new OauthUserUpdateVO();
        oauthUserUpdateVO.setDataId(oauthUser.getId());
        return oauthUserUpdateVO;
    }



    /**
     * 判断code是否重复
     * @param corpid
     * @param userId
     * @param code 唯一码
     * @return
     */
    public boolean codeRepeat(String corpid, String userId, String code) {
        if (StringUtil.isEmpty(code)) {
            return false;
        }
        Map<String, Object> param = new HashMap<>();
        param.put("corpid", corpid);
        param.put("userIdNeq", userId);
        param.put("code", code);
        param.put("del", 0);
        Integer count = oauthUserModel.getEntityCount(param);
        return  count > 0;
    }
}
